// compile: g++ -o macro macro.cc -D lei -std=c++11
// run: ./macro
#include <iostream>
using namespace std;
// 宏定义指令
void Test1() {
#define PI 3.1415926
#define S(a, b) (a) * (b) / 2
  cout << PI << endl;
  cout << S(PI, 1) << endl;
}
// 文件包含指令
void Test2() {
// #include "xxx.h"
// #include "xxx.cc"
#include <cstdio>
}
// 条件编译指令
void Test3() {
#ifdef lei
  cout << "def lei" << endl;
#undef lei
#else
  cout << "doesnt def lei" << endl;
#endif

#define lei2
#ifndef lei2
  cout << "doesnt def lei2" << endl;
#elif defined lei2
  cout << "def lei2" << endl;
#endif

  int a = 2;
// #if a > 1  宏的处理在预处理，是最先的一个阶段
#if 2 > 1
  cout << "a==1" << endl;
#else
  cout << "a!=1" << endl;
#endif
}
// 其他指令
void Test4() {}

// 编译器内置宏
void Test5() {
  cout << __FUNCTION__ << endl;
  cout << __FILE__ << endl;
  cout << __LINE__ << endl;
}

// 宏特殊符号
#define LOG_INFO(a)                                 \
  do {                                              \
    cout << "This is Macro LOG_INFO:" << a << endl; \
  } while (0)

void Test6() {
  LOG_INFO("lei");
  LOG_INFO(4.565);
}

int main() {
  //   Test1();
  //   Test2();
  //   Test3();
  //   Test4();
  Test5();
  // Test6();
}